﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Manager.Camada.Logica;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using Manager.Camada.Negocio;


namespace Manager.Camada.BancoDados
{
    public class UsuarioDAOImpl : UsuarioDAO
    {

        EmpresaDAOImpl daoEmpresa = new EmpresaDAOImpl();
        TipoUsuarioDAOImpl daoTipoUsuario = new TipoUsuarioDAOImpl();

        string strConnection = ConfigurationManager.ConnectionStrings["ConexaoBanco"].ConnectionString.ToString();

        public int inserirUsuario(UsuarioVO usuario)
        {
            string insertedID = null;

            using (SqlConnection sqlconnection = new SqlConnection(strConnection))
            {
                sqlconnection.Open();

                SqlTransaction transaction = sqlconnection.BeginTransaction("SampleTransaction");

                try
                {
                    string sqlBusca = "INSERT INTO USUARIO " +
                                      "(IDEMPRESA,IDTIPO_USUARIO,LOGIN,SENHA) " +
                                      "VALUES " +
                                      "(@IdEmpresa,@TipoUsuario,@Login,@Senha);SELECT SCOPE_IDENTITY()";// SET @id = SCOPE_IDENTITY()

                    SqlCommand cmd = new SqlCommand(sqlBusca, sqlconnection, transaction);

                    cmd.Parameters.Add(new SqlParameter("@IdEmpresa", usuario.empresa.idEmpresa));
                    cmd.Parameters.Add(new SqlParameter("@TipoUsuario", usuario.tipoUsuario.idTipo_Usuario));
                    cmd.Parameters.Add(new SqlParameter("@Login", usuario.login));
                    cmd.Parameters.Add(new SqlParameter("@Senha", usuario.senha));

                    insertedID = cmd.ExecuteScalar().ToString();

                    transaction.Commit();

                    sqlconnection.Close();
                    sqlconnection.Open();

                    SqlTransaction transaction2 = sqlconnection.BeginTransaction("SampleTransaction2");
                  
                }
                catch
                {
                    transaction.Rollback();
                    sqlconnection.Close();
                }

                return Convert.ToInt32(insertedID);
            }
        }

        public List<UsuarioVO> buscarTodosUsuariosPorEmpresa(int idEmpresa)
        {
            List<UsuarioVO> listaUsuario = new List<UsuarioVO>();

            using (SqlConnection sqlconnection = new SqlConnection(strConnection))
            {
                sqlconnection.Open();

                SqlTransaction transaction = sqlconnection.BeginTransaction("SampleTransaction");

                try
                {
                    string sqlBusca = "SELECT B.IDUSUARIO, A.IDTIPO_USUARIO, A.NOME, [LOGIN], A.SENHA " +
                                      "FROM USUARIO A " +
                                      "INNER JOIN EMPRESA_USUARIO  B ON B.IDUSUARIO = A.IDUSUARIO AND B.IDEMPRESA = @IdEmpresa";


                    SqlCommand cmd = new SqlCommand(sqlBusca, sqlconnection,transaction);

                    cmd.Parameters.AddWithValue("@IdEmpresa", idEmpresa);

                    SqlDataReader dr = cmd.ExecuteReader();

                    DataTable tblUsuario = new DataTable();
                    tblUsuario.Load(dr);

                    if (tblUsuario.Rows.Count > 0)
                    {
                        listaUsuario = mountListaUsuario(tblUsuario);
                    }

                    transaction.Commit();
                    sqlconnection.Close();
                }
                catch
                {
                    transaction.Rollback();
                    sqlconnection.Close();
                }

                return listaUsuario;
            }
        }

        public bool confereExistenciaUsuario(string nomeUsuario)
        {
            bool existe = false;

            using (SqlConnection sqlconnection = new SqlConnection(strConnection))
            {
                sqlconnection.Open();

                SqlTransaction transaction = sqlconnection.BeginTransaction("SampleTransaction");

                try
                {
                    string sqlBusca = "SELECT * FROM USUARIO " +
                                     "WHERE NOME = @NomeUsuario";


                    SqlCommand cmd = new SqlCommand(sqlBusca, sqlconnection, transaction);

                    cmd.Parameters.AddWithValue("@NomeUsuario", nomeUsuario);
                    
                    SqlDataReader dr = cmd.ExecuteReader();

                    DataTable tblUsuario = new DataTable();
                    tblUsuario.Load(dr);

                    if (tblUsuario.Rows.Count > 0)
                    {
                        existe = true;
                    }

                    transaction.Commit();
                    sqlconnection.Close();
                }
                catch
                {
                    transaction.Rollback();
                    sqlconnection.Close();
                }
            }

            return existe;
        }

        public UsuarioVO buscaLoginUsuario(string login, string senha)
        {
            UsuarioVO usuario = new UsuarioVO();

            using (SqlConnection sqlconnection = new SqlConnection(strConnection))
            {
                sqlconnection.Open();

                SqlTransaction transaction = sqlconnection.BeginTransaction("SampleTransaction");

                try
                {
                    string sqlBusca = "SELECT * FROM USUARIO " +
                                      "WHERE LOGIN = @Login AND SENHA = @Senha";


                    SqlCommand cmd = new SqlCommand(sqlBusca, sqlconnection, transaction);

                    cmd.Parameters.AddWithValue("@Login", login);
                    cmd.Parameters.AddWithValue("@Senha", senha);

                    SqlDataReader dr = cmd.ExecuteReader();

                    DataTable tblUsuario = new DataTable();
                    tblUsuario.Load(dr);

                    if (tblUsuario.Rows.Count > 0)
                    {
                        foreach (DataRow row in tblUsuario.Rows)
                        {
                            usuario = mountUsuario(row);
                        }
                    }

                    transaction.Commit();
                    sqlconnection.Close();
                }
                catch
                {
                    transaction.Rollback();
                    sqlconnection.Close();
                }
            }

            return usuario;
        }

        private UsuarioVO mountUsuario(DataRow row)
        {
            UsuarioVO usuario = new UsuarioVO();

            usuario.idUsuario = Convert.ToInt32(row["IDUSUARIO"]);
            EmpresaVO empresa = daoEmpresa.buscaEmpresaPorId(Convert.ToInt32(row["IDEMPRESA"]));
            usuario.empresa = empresa;

            TipoUsuarioVO tipoUsuario = daoTipoUsuario.buscaTipoUsuarioPorId(Convert.ToInt32(row["IDTIPO_USUARIO"]));
            usuario.tipoUsuario = tipoUsuario;
            usuario.login = Convert.ToString(row["LOGIN"]);
            usuario.senha = Convert.ToString(row["SENHA"]);

            return usuario;
        }

        private List<UsuarioVO> mountUsuario(DataTable tblUsuario)
        {
            List<UsuarioVO> listaUsuario = new List<UsuarioVO>();

            foreach (DataRow row in tblUsuario.Rows)
            {
                UsuarioVO usuario = new UsuarioVO();

                usuario.idUsuario = Convert.ToInt32(row["IDUSUARIO"]);
                //usuario.tipoUsuario.idTipo_Usuario = Convert.ToInt32(row["IDTIPO_USUARIO"]);
                
                usuario.login = Convert.ToString(row["LOGIN"]);
                usuario.senha = Convert.ToString(row["SENHA"]);

                listaUsuario.Add(usuario);
            }

            return listaUsuario;
        }

        private List<UsuarioVO> mountListaUsuario(DataTable tblUsuario)
        {
            List<UsuarioVO> listaUsuario = new List<UsuarioVO>();

            foreach (DataRow row in tblUsuario.Rows)
            {
                UsuarioVO usuario = new UsuarioVO();

                usuario.idUsuario = Convert.ToInt32(row["IDUSUARIO"]);
                //usuario.tipoUsuario.idTipo_Usuario = Convert.ToInt32(row["IDTIPO_USUARIO"]);
                usuario.login = Convert.ToString(row["LOGIN"]);
                usuario.senha = Convert.ToString(row["SENHA"]);

                listaUsuario.Add(usuario);
            }

            return listaUsuario;
        }

        //--------------------------------------------------------------------------------------------
       // EmpresaDAOImpl daoEmpresa = new EmpresaDAOImpl();

        public UsuarioEmpresaVO loginUsuario(string login, string senha, int empresa)
        {
            UsuarioEmpresaVO usuarioEmpresa = new UsuarioEmpresaVO();

            SqlConnection sqlconnection = new SqlConnection(strConnection);

            try
            {
                string sqlBusca = "SELECT A.IDUSUARIO," +
                                         "A.NOME AS NOME_USUARIO,"+ 
                                         "A.LOGIN,"+
                                         "A.SENHA,"+
                                         "A.TIPO_USUARIO,"+
                                         "D.IDEMPRESA," +
                                         "D.NOME AS NOME_EMPRESA FROM USUARIO A " +
                                    "JOIN EMPRESA_USUARIO C ON C.IDUSUARIO = A.IDUSUARIO " +
                                    "JOIN EMPRESA         D ON D.IDEMPRESA = C.IDEMPRESA " +
                                   "WHERE A.LOGIN     = @Login " +
                                     "AND A.SENHA     = @Senha " +
                                     "AND C.IDEMPRESA = @Empresa ";

                
                sqlconnection.Open();

                SqlCommand cmd = new SqlCommand(sqlBusca, sqlconnection);

                cmd.Parameters.AddWithValue("@Login", login);
                cmd.Parameters.AddWithValue("@Senha", senha);
                cmd.Parameters.AddWithValue("@Empresa", empresa);

                SqlDataReader dr = cmd.ExecuteReader();

                DataTable tblUsuario = new DataTable();
                tblUsuario.Load(dr);

                if (tblUsuario.Rows.Count > 0)
                {
                    usuarioEmpresa = mountUsuarioEmpresa(tblUsuario);
                }

            }
            catch(Exception ex)
            {
                sqlconnection.Close();
            }

            sqlconnection.Close();

            return usuarioEmpresa;
        }

        private UsuarioEmpresaVO mountUsuarioEmpresa(DataTable tblUsuario)
        {
            UsuarioEmpresaVO usu = new UsuarioEmpresaVO();

            foreach (DataRow row in tblUsuario.Rows)
            {
                UsuarioVO usuario = new UsuarioVO();

                //Monta o usuario.
                usuario.idUsuario = Convert.ToInt32(row["IDUSUARIO"]);
                usuario.login = Convert.ToString(row["LOGIN"]);
                usuario.senha = Convert.ToString(row["SENHA"]);
               // usuario.tipoUsuario.idTipo_Usuario = Convert.ToString(row["TIPO_USUARIO"]);

                usu.usuario = usuario;

                EmpresaVO empresa = new EmpresaVO();

                //Monta a empresa.
                empresa.idEmpresa = Convert.ToInt32(row["IDEMPRESA"]);
                empresa.nome    = Convert.ToString(row["NOME_EMPRESA"]);

                usu.empresa = empresa;

                TipoUsuarioVO tipoUsuario = new TipoUsuarioVO();

                //Monta o tipo usuario
                //tipoUsuario.idTipoUsuario = Convert.ToInt32(row["IDTIPO_USUARIO"]);
                //tipoUsuario.tipoUsuario = Convert.ToString(row["TIPO_USUARIO"]);

                usu.tipoUsuario = tipoUsuario;

           }

            return usu;
        }

       
        public List<UsuarioVO> getTodosUsuariosEmpresa(int idEmpresa)
        {
            UsuarioVO usuario = new UsuarioVO();

            SqlConnection sqlconnection = new SqlConnection(strConnection);

            List<UsuarioVO> listaUsuario = new List<UsuarioVO>();

            try
            {
                string sqlBusca = "SELECT D.IDUSUARIO,  D.NOME, D.LOGIN, D.SENHA, D.TIPO_USUARIO " +
                                    "FROM EMPRESA    A " +
                                    "JOIN EMPRESA_USUARIO C ON C.IDEMPRESA  = A.IDEMEPRESA " +
                                    "JOIN USUARIO         D ON D.IDUSUARIO  = C.IDUSUARIO " +
                                   "WHERE A.IDEMEPRESA = @Empresa ";

                sqlconnection.Open();

                SqlCommand cmd = new SqlCommand(sqlBusca, sqlconnection);

                cmd.Parameters.AddWithValue("@Empresa", idEmpresa);

                SqlDataReader dr = cmd.ExecuteReader();

                DataTable tblUsuario = new DataTable();
                tblUsuario.Load(dr);

                if (tblUsuario.Rows.Count > 0)
                {
                    foreach (DataRow dt in tblUsuario.Rows)
                    {
                        listaUsuario.Add(mountUsuarioList(dt));
                    }
                }

            }
            catch (Exception ex)
            {
                sqlconnection.Close();
            }

            sqlconnection.Close();

            return listaUsuario;

        }

        private UsuarioVO mountUsuarioList(DataRow row)
        {
            UsuarioVO usuario = new UsuarioVO();

                usuario.idUsuario = Convert.ToInt32(row["IDUSUARIO"]);
                usuario.login = Convert.ToString(row["LOGIN"]);
                usuario.senha = Convert.ToString(row["SENHA"]);
               // usuario.tipoUsuario = Convert.ToString(row["TIPO_USUARIO"]);
                

            return usuario;
        }

        //private UsuarioVO mountUsuario(DataTable tblUsuario)
        //{
        //    //PermissaoDAOImpl daoPermissao = new PermissaoDAOImpl();
        //    UsuarioVO usuario = new UsuarioVO();

        //    foreach (DataRow row in tblUsuario.Rows)
        //    {
        //        usuario.idUsuario = Convert.ToInt32(row["idUsuario"]);
        //        //usuario.permissao = daoPermissao.getPermissaoVO(Convert.ToInt32(row["idPermissao"]));
        //        //usuario.empresa = daoEmpresa.getEmpresa(Convert.ToInt32(row["idEmpresa"]));
        //        usuario.nome = Convert.ToString(row["nome"]);
        //        usuario.login = Convert.ToString(row["login"]);
        //        usuario.senha = Convert.ToString(row["senha"]);
        //    }

        //    return usuario;
        //}


        public UsuarioVO getUsuario(long idUsuario)
        {
            UsuarioVO usuario = new UsuarioVO();

            SqlConnection sqlconnection = new SqlConnection(strConnection);

            try
            {
                string sqlBusca = "SELECT * FROM USUARIO WHERE IDUSUARIO = @idUsuario";

                sqlconnection.Open();

                SqlCommand cmd = new SqlCommand(sqlBusca, sqlconnection);

                cmd.Parameters.AddWithValue("@idUsuario", idUsuario);

                SqlDataReader dr = cmd.ExecuteReader();

                DataTable tblUsuario = new DataTable();
                tblUsuario.Load(dr);

                if (tblUsuario.Rows.Count > 0)
                {
                    foreach (DataRow row in tblUsuario.Rows)
                    {
                        usuario = mountUsuarioVO(row);   
                    }
                }

            }
            catch (Exception ex)
            {
                sqlconnection.Close();
            }

            sqlconnection.Close();

            return usuario;
        }

        private UsuarioVO mountUsuarioVO(DataRow row)
        {
            PermissaoDAOImpl daoPermissao = new PermissaoDAOImpl();
            UsuarioVO usuario = new UsuarioVO();

            usuario.idUsuario = Convert.ToInt32(row["idUsuario"]);
            usuario.login = Convert.ToString(row["login"]);
            usuario.senha = Convert.ToString(row["senha"]);

            return usuario;
        }

        public List<UsuarioVO> getTodosUsuarioTipoGerente(long idEmpresa)
        {
            List<UsuarioVO> listaUsuario = new List<UsuarioVO>();

            SqlConnection sqlconnection = new SqlConnection(strConnection);

            try
            {
                string sqlBusca = "SELECT * FROM USUARIO WHERE IDEMPRESA = @idEmpresa AND idPermissao = 4";

                sqlconnection.Open();

                SqlCommand cmd = new SqlCommand(sqlBusca, sqlconnection);

                cmd.Parameters.AddWithValue("@idEmpresa", idEmpresa);

                SqlDataReader dr = cmd.ExecuteReader();

                DataTable tblUsuario = new DataTable();
                tblUsuario.Load(dr);

                if (tblUsuario.Rows.Count > 0)
                {
                    foreach (DataRow row in tblUsuario.Rows)
                    {
                        listaUsuario.Add(mountUsuarioVO(row));   
                    }
                }
            }
            catch
            {
                sqlconnection.Close();
            }

            sqlconnection.Close();

            return listaUsuario;
        }

        //public string inserirUsuario(UsuarioVO usu)
        //{
        //    string insertedID = null;

        //    using (SqlConnection sqlconnection = new SqlConnection(strConnection))
        //    {
        //        try
        //        {

        //            string sqlBusca = "INSERT INTO USUARIO (NOME, LOGIN, SENHA, TIPO_USUARIO) VALUES (@Nome, @Login, @Senha, @TipoUsuario);SELECT SCOPE_IDENTITY()";// SET @id = SCOPE_IDENTITY()

        //            sqlconnection.Open();

        //            SqlCommand cmd = new SqlCommand(sqlBusca, sqlconnection);

        //            cmd.Parameters.Add(new SqlParameter("@Nome", usu.nome));
        //            cmd.Parameters.Add(new SqlParameter("@Login", usu.login));
        //            cmd.Parameters.Add(new SqlParameter("@Senha", usu.senha));
        //            cmd.Parameters.Add(new SqlParameter("@TipoUsuario", usu.tipoUsuario));

        //            insertedID = cmd.ExecuteScalar().ToString();

        //            sqlconnection.Close();

        //        }
        //        catch
        //        {
        //        }

        //    }

        //    return insertedID;
        //}
    }
}
